Skip to content

fix(sinopac): fetch contracts on demand when Stocks lookup misses#16

Open
koreal6803 wants to merge 1 commit into
mainfrom
fix/sinopac-contract-fetch-fallback
Open

fix(sinopac): fetch contracts on demand when Stocks lookup misses#16
koreal6803 wants to merge 1 commit into
mainfrom
fix/sinopac-contract-fetch-fallback

Conversation

@koreal6803

Copy link
Copy Markdown
Collaborator

問題

finlab 永豐 broker 在 shioaji <1.7 環境下,用戶下單時對正常交易的股票(例:8421 旭源)回 下單失敗: 'Contract not found: 8421'

根因

SinopacAccount 登入用 api.login(..., fetch_contract=False),shioaji <1.7 因此不會下載合約檔_get_contract() 走到:

stocks = getattr(getattr(self.api, 'Contracts', None), 'Stocks', None)
if stocks is not None:
    return stocks[stock_id]   # 空的 Stocks -> KeyError('Contract not found: 8421')
self.api.fetch_contracts(...)  # 因為 stocks 不是 None,永遠到不了這行

空的 Contracts.Stocks 物件 is not None 為真,fetch_contracts() fallback 永遠不會被觸發。shioaji 1.7 走 api.contracts.get() 不受影響。

修法

Stocks 查詢 miss(KeyError 或 None)時落到 fetch_contracts() + 重試;真正下市的代碼仍照常 raise。

測試

以 stub 模擬三種情境(不需真實 shioaji)驗證抽取自本檔的實際 _get_contract

  • shioaji <1.7:Stocks 空 → 觸發 fetch_contracts → 取得合約 ✅
  • shioaji 1.7:api.contracts.get() 直接解析 ✅
  • 真正下市代碼:fetch 後仍 miss → KeyError 照常拋出 ✅

嚴重度:中(影響所有 pin shioaji<1.7 且有實際下單的永豐用戶;升級 shioaji>=1.7 可繞過)。

🤖 Generated with Claude Code

On shioaji <1.7, login() uses fetch_contract=False so no contracts are
downloaded. _get_contract then hit `return stocks[stock_id]` on an empty
Contracts.Stocks, raising KeyError('Contract not found: <id>') for actively
traded stocks (e.g. 8421). The fetch_contracts() fallback was unreachable
because the empty Stocks object is not None.

Now the KeyError (or None) from the Stocks lookup falls through to
fetch_contracts() + retry, so <1.7 users can place orders; genuinely
delisted symbols still raise as before. shioaji 1.7 path (api.contracts.get)
is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants